/************************************************************************
  Scheme interpreter
  
  Copyright (C) 2010 Marioly Garza 

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Lesser General Public License as
  published by the Free Software Foundation, either version 3 of the
  License, or (at your option) any later version.
  
  This program is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.
  
  You should have received a copy of the GNU Lesser General Public
  License along with this program. If not, see
  <http://www.gnu.org/licenses/>.

************************************************************************/

#include "lexer.h"   

std::queue<object*> lexer::tokenize(std::string str)
{
    char delimiters[] = {' ', '(', ')', '[', ']', '[', ']', '"', ',', '\'', '`', ';'};
    std::string buf("");
    std::queue<object*> tokens;
    int opens = 0;
    int length = str.length();
    for (int i = 0; i < length; i++)
    {
        char c = str[i];
        if (array::index_of(delimiters, 12, c) != -1)
        {
            if (!buf.empty()) {
                tokens.push(new sstring(buf));
                buf = "";
            }

            if (c != ' ') {
                tokens.push(new sstring(std::string(1, c)));
            }
            if (c == '(')
                opens++;
            if (c == ')')
                opens--;
        }
        else
        {
            buf += c;
        }
    }

    if (opens != 0)
        throw scheme_exception("unbalanced parens");

    return tokens;
}
